package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.ContractDao;
import cn.itcast.dao.cargo.ContractProductDao;
import cn.itcast.dao.cargo.ExtCproductDao;
import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.vo.ContractProductVo;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author LT
 * @version 1.0.0
 * @ClassName ContractProductServiceImpl.java
 * @Description TODO 货物服务实体类
 * @createTime 2020年03月31日 23:45:00
 */
@Service
public class ContractProductServiceImpl implements ContractProductService {

    @Autowired
    private ContractProductDao contractProductDao;

    @Autowired
    private ContractDao contractDao;

    @Autowired
    private ExtCproductDao extCproductDao;

    /**
     * 查找货物列表分页页面  ctrl +shirt + R 替換哦
     *
     * @param contractProductExample
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public PageInfo<ContractProduct> findByPage(ContractProductExample contractProductExample, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        //查找对应的数据
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(contractProductExample);
        return new PageInfo<>(contractProductList);
    }

    /**
     * 查找所有的货物
     *
     * @param contractProductExample
     * @return
     */
    @Override
    public List<ContractProduct> findAll(ContractProductExample contractProductExample) {
        return contractProductDao.selectByExample(contractProductExample);
    }

    /**
     * 根据主键查找
     *
     * @param id
     * @return
     */
    @Override
    public ContractProduct findById(String id) {
        return contractProductDao.selectByPrimaryKey(id);
    }

    /**
     * 時間
     *
     * @param contractProduct
     */
    @Override
    public void save(ContractProduct contractProduct) {
        contractProduct.setId(UUID.randomUUID().toString());
        //注意： 因为创建时间与更新时间字段不能为空，所以我们在插入数据的时候需要补充这两个字段的值
        contractProduct.setCreateTime(new Date());
        contractProduct.setUpdateTime(new Date());

        //  1. 计算出货物的总价
        double amount = 0;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            // 货物 * 价格
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
            contractProduct.setAmount(amount);
        }
        //  2. 插入一个货物的记录
        contractProductDao.insertSelective(contractProduct);

        //  3. 重新计算购销合同的总价
        //找到到购销合同
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        if (contract.getTotalAmount() == null) {
            // 第一次添加货物,购销合同的总价等于当前货物总价
            contract.setTotalAmount(amount);
        } else {
            contract.setTotalAmount(contract.getTotalAmount() + amount);
        }
        //  4. 重新计算购销合同的产品的种类数量(原来的种类数量+1)
        contract.setProNum(contract.getProNum() + 1);
        //  5. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);
    }


    /**
     * 更新货物
     *
     * @param contractProduct
     */
    @Override
    public void update(ContractProduct contractProduct) {
        contractProduct.setUpdateTime(new Date());
        // 找到更新货物之前的货物数据
        ContractProduct dbContractProduct = contractProductDao.selectByPrimaryKey(contractProduct.getId());
        // 1.计算出货物的总价
        double amount = 0;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
            contractProduct.setAmount(amount);
        }
        // 2.更新货物的记录
        contractProductDao.updateByPrimaryKeySelective(contractProduct);

        // 3.重新计算购销合同的总价
        // 购销合同的总价 = 购销合同的原本总价 - 货物修改之前的总价(100) + 货物当前的总价(200)
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        contract.setTotalAmount(contract.getTotalAmount() - dbContractProduct.getAmount() + amount);

        // 4.更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);

    }

    /**
     * 删除 根据货物的id删除
     *
     * @param id
     */
    @Override
    public void delete(String id) {
        // 找到马上要被删除货物对象
        ContractProduct dbContractProduct = contractProductDao.selectByPrimaryKey(id);
        // 1.删除货物
        contractProductDao.deleteByPrimaryKey(id);
        // 2.删除附件(一个货物是可能出现多个附件的)
        // 找到附件
        ExtCproductExample extCproductExample = new ExtCproductExample();
        // 根据货物的id查找所有的附件
        extCproductExample.createCriteria().andContractIdEqualTo(id);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
        int totalExtAmount = 0; // 保存所有附件的总价
        if (extCproductList != null) {
            for (ExtCproduct extCproduct : extCproductList
            ) {
                totalExtAmount += extCproduct.getAmount();
                // 遍历所有的附件，然后逐个删除
                extCproductDao.deleteByPrimaryKey(extCproduct.getId());
            }
        }
        // 3. 重新计算购销合同的总价   购销合同的总价 = 购销合同原始的总价 - 货物的总价 - 附件的总价
        //找到购销合同
        Contract contract = contractDao.selectByPrimaryKey(dbContractProduct.getContractId());
        contract.setTotalAmount(contract.getTotalAmount() - dbContractProduct.getAmount() - totalExtAmount);
        // 4.修改购销合同的货物的数量
        contract.setProNum(contract.getProNum() - 1);
        // 5.修改购销合同的附件的数量
        if (extCproductList != null) {
            contract.setExtNum(contract.getExtNum() - extCproductList.size());
        }
        // 6.更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);
    }

    /**
     * 根据船期查找货物
     *
     * @param companyId
     * @param shipTime
     * @return
     */
    @Override
    public List<ContractProductVo> findByShipTime(String companyId, String shipTime) {
        return contractProductDao.findByShipTime(companyId, shipTime);
    }
}
